#ifndef __SCANNER_H
#define __SCANNER_H

#include "token.h"

#define MAX_STATE 6
#define START_STATE 0 // Initial state


#define NO_EDGE -1 // No-passage state


// left_arm0 | left_arm1 | right_arm0 | right_arm1 | left_leg0 | left_leg1 | right_leg0 | right_leg1 | torso
// sin | cos | pow |sqrt | tan | log | abs
// translate, rotate, def
// begind, end
#define RESERWED_WORDS 39

class Scanner
{
private:
    string input;
    Token lastToken; // trenutni osnovni leks. simbol
    int row, column;  // stolpec, vrstica vhodne datoteke

    int automata[MAX_STATE+1][256]; // tabela prehodov
    int finite[MAX_STATE+1]; // tabela koncnih stanj
    string reswdWords[RESERWED_WORDS];

    void initAutomat();  // inicializacija tabele prehodov in tabele koncnih stanj
    bool isReservedWord(string s);

    // naaslednje stanje vemo, ce poznamo trenutno stanje in znak na vhodu
    // z pogledom v tabelo
    int getNextState(int aState, int aChar) const;

    bool isFiniteState(int aState) const;
    int getFiniteState(int aState) const;

    // preberi naslednji znak na vhodu
    int read();
    bool eof();
    int peek();


    // poisci naslednji osnovni leks. simbol
public:
    // ctor
    Scanner(string input);
    Scanner();

    void setInput(string _input);
    Token nextTokenImp();
    Token nextToken();
    Token currentToken();
};

#endif
